<?php
/**
 * Created by Ling.
 * Created on 2021/3/26 15:25
 * @email: L_ing1992@163.com
 */

namespace App\Console\Commands;


use Illuminate\Console\Command;

class NewModuleCommand extends Command
{
    /**
     * 指令
     * @var string
     */
    protected $signature = 'make:module
                                {module : 模块名称}
                                {--f : 当部分模块文件已存时，跳过并继续创建}';

    /**
     * 指令描述
     * @var string
     */
    protected $description = '创建 模块 (包括 controller model  router )';

    protected bool $f = false;

    /**
     * 指令执行内容
     */
    public function handle(): void
    {
        $module = $this->argument('module');
        $this->f = $this->option('f');
        // 1、检测并创建 routes/web 目录
        $subRouterDir = base_path('routes/web');
        if (!is_dir($subRouterDir) && !mkdir($subRouterDir, 0755)) {
            $this->error('无法创建 目录:' . $subRouterDir);
            if (!$this->f) return;
        }
        // 2、检测 moduleRouteFile 是否存在
        $moduleRouteFile = $subRouterDir . '/' . lcfirst($module) . '.php';
        if (is_file($moduleRouteFile)) {
            $this->error("【{$module}】 RouterFile exist !!!  模块 $module 已经存在 ！！！");
            if (!$this->f) return;
        }
        // 3、检测 controller、model、service的子目录是否存在,不存在则创建
        if (!$this->checkPaths($module)) return;
        // 4、生成 moduleRouteFile 文件并 在web.php在追加引用
        file_put_contents($moduleRouteFile, str_replace(
            ['{$prefix}', '{$namespace}'],
            [lcfirst($module), ucfirst($module)],
            file_get_contents(__DIR__ . '/templates/config.stub')));
        file_put_contents(base_path('routes/web.php'),
            "//模块$module  \nrequire __DIR__ . '/web/" . $module . ".php';\n",
            FILE_APPEND);
        $this->info('完成！！');
    }

    protected function checkPaths(string $module): bool
    {
        $mName = ucwords($module);

        $controllerPath = base_path('app/Http/Controllers/' . $mName);
        $servicePath = base_path('app/Services/' . $mName);
        $modelPath = base_path('app/Models/' . $mName);

        $paths = compact('controllerPath', 'servicePath', 'modelPath');
        foreach ($paths as $path) {
            if (is_dir($path)) {
                $this->error("【{$module}】 Controller exist !!!  模块 {$mName}Controller 已经存在 ！！！");
                if (!$this->f) return false;
            }
        }
        foreach ($paths as $path) {
            if (!is_dir($path) && !mkdir($path, 0755)) {
                $this->error('无法创建 目录:' . $path);
                if (!$this->f) return false;
            }
        }
        return true;
    }
}
